home *** CD-ROM | disk | FTP | other *** search
/ System Booster / System Booster.iso / Archives / GNU / ags_000.lha / gs261rkmmodel.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-07-15  |  3.3 KB  |  146 lines

  1. #include <exec/types.h>
  2. #include <intuition/intuition.h>
  3. #include <intuition/classes.h>
  4. #include <intuition/classusr.h>
  5. #include <intuition/cghooks.h>
  6. #include <intuition/icclass.h>
  7. #include <utility/tagitem.h>
  8. #include <utility/hooks.h>
  9. #include <clib/utility_protos.h>
  10. #include <graphics/graphint.h>
  11. #include <clib/alib_protos.h>
  12. #include <clib/intuition_protos.h>
  13. #include "rkmmodel.h"
  14.  
  15. #define DEFAULTLIMIT 100
  16.  
  17. struct RKMModData {
  18.   ULONG currval;
  19.   ULONG limit;
  20.   int id;
  21. };
  22.  
  23. ULONG dispatchRKMModel(Class *,Object *,Msg);
  24. void NotifyCurrVal(Class *,Object *,struct opUpdate *,\
  25.            struct RKMModData *);
  26. Class *initRKMModClass(void)
  27. {
  28.   Class *cl=NULL;
  29.   extern ULONG HookEntry();
  30.   
  31.   if((cl=MakeClass(NULL,"modelclass",NULL,sizeof(struct RKMModData),\
  32.            0))!=NULL)
  33.     {
  34.       cl->cl_Dispatcher.h_Entry=HookEntry;
  35.       cl->cl_Dispatcher.h_SubEntry=dispatchRKMModel;
  36.     }
  37.   return cl;
  38. }
  39.  
  40. BOOL freeRKMModClass(Class *cl)
  41. {
  42.   return FreeClass(cl);
  43. }
  44.  
  45. ULONG dispatchRKMModel(Class *cl,Object *o,Msg msg)
  46. {
  47.   struct RKMModData *mmd;
  48.   APTR retval=NULL;
  49.   switch(msg->MethodID)
  50.     {
  51.     case OM_NEW:
  52.       if((retval=(APTR)DoSuperMethodA(cl,o,msg))!=NULL)
  53.     {
  54.       mmd=INST_DATA(cl,retval);
  55.       mmd->currval=GetTagData(RKMMOD_CurrVal,0,\
  56.                   ((struct opSet *)msg)->ops_AttrList);
  57.       mmd->limit=GetTagData(RKMMOD_Limit,0,\
  58.                 ((struct opSet *)msg)->ops_AttrList);
  59.       mmd->id=GetTagData(RKMMOD_Id,0,((struct opSet *)msg)->ops_AttrList);
  60.     }
  61.       break;
  62.     case OM_SET:
  63.     case OM_UPDATE:
  64.       mmd=INST_DATA(cl,o);
  65.       DoSuperMethodA(cl,o,msg);
  66.       {
  67.     struct TagItem *tstate,*ti;
  68.     
  69.     ti=((struct opSet *)msg)->ops_AttrList;
  70.     tstate=ti;
  71.     while(ti=NextTagItem(&tstate))
  72.       {
  73.         switch(ti->ti_Tag)
  74.           {
  75.           case RKMMOD_CurrVal:
  76.         if((ti->ti_Data)>mmd->limit) mmd->currval=mmd->limit;
  77.           else
  78.             {
  79.               if((ti->ti_Data)<0) mmd->currval=0;
  80.               else mmd->currval=ti->ti_Data;
  81.             }
  82.         NotifyCurrVal(cl,o,(struct opUpdate *)msg,mmd);
  83.         retval=(APTR)1;
  84.         break;
  85.           case RKMMOD_Up:
  86.         mmd->currval++;
  87.         if((mmd->currval)>mmd->limit) mmd->currval=mmd->limit;
  88.         NotifyCurrVal(cl,o,(struct opUpdate *)msg,mmd);
  89.         retval=(APTR)1;
  90.         break;
  91.           case RKMMOD_Down:
  92.         mmd->currval--;
  93.         if((mmd->currval) == -1) mmd->currval=0;
  94.         NotifyCurrVal(cl,o,(struct opUpdate *)msg,mmd);
  95.         retval=(APTR)1;
  96.         break;
  97.           case RKMMOD_Limit:
  98.         mmd->limit=ti->ti_Data;
  99.         break;
  100.           case RKMMOD_Id:
  101.         mmd->id=ti->ti_Data;
  102.         break;
  103.           }
  104.       }
  105.       }
  106.       break;
  107.     case OM_GET:
  108.       mmd=INST_DATA(cl,o);
  109.       switch(((struct opGet *)msg)->opg_AttrID)
  110.          {
  111.          case RKMMOD_CurrVal:
  112.            *(((struct opGet *)msg)->opg_Storage)=mmd->currval;
  113.            retval=(Object *)TRUE;
  114.            break;
  115.          case RKMMOD_Id:
  116.            *(((struct opGet *)msg)->opg_Storage)=mmd->id;
  117.            retval=(Object *)TRUE;
  118.            break;
  119.          default:
  120.            retval=(APTR)DoSuperMethodA(cl,o,msg);
  121.            break;
  122.          }
  123.       break;
  124.     default:
  125.       retval=(APTR)DoSuperMethodA(cl,o,msg);
  126.       break;
  127.     }
  128.   return (ULONG)retval;
  129. }
  130.  
  131. void NotifyCurrVal(Class *cl,Object *o,struct opUpdate *msg,\
  132.            struct RKMModData *mmd)
  133. {
  134.   struct TagItem tt[3];
  135.   
  136.   tt[0].ti_Tag=RKMMOD_CurrVal;
  137.   tt[0].ti_Data=mmd->currval;
  138.   tt[1].ti_Tag=RKMMOD_Id;
  139.   tt[1].ti_Data=mmd->id;
  140.   tt[2].ti_Tag=TAG_DONE;
  141.  
  142.   DoSuperMethod(cl,o,OM_NOTIFY,tt,msg->opu_GInfo,\
  143.         ((msg->MethodID == OM_UPDATE) ?    (msg->opu_Flags) : 0));
  144. }
  145.  
  146.